{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Cox-PH and DeepSurv\n",
    "\n",
    "In this notebook we will train the [Cox-PH method](http://jmlr.org/papers/volume20/18-424/18-424.pdf), also known as [DeepSurv](https://bmcmedresmethodol.biomedcentral.com/articles/10.1186/s12874-018-0482-1).\n",
    "We will use the METABRIC data sets as an example\n",
    "\n",
    "A more detailed introduction to the `pycox` package can be found in [this notebook](https://nbviewer.jupyter.org/github/havakv/pycox/blob/master/examples/01_introduction.ipynb) about the `LogisticHazard` method.\n",
    "\n",
    "The main benefit Cox-CC (and the other Cox methods) has over Logistic-Hazard is that it is a continuous-time method, meaning we do not need to discretize the time scale."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn_pandas import DataFrameMapper\n",
    "\n",
    "import torch\n",
    "import torchtuples as tt\n",
    "\n",
    "from pycox.datasets import metabric\n",
    "from pycox.models import CoxPH\n",
    "from pycox.evaluation import EvalSurv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "## Uncomment to install `sklearn-pandas`\n",
    "# ! pip install sklearn-pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(1234)\n",
    "_ = torch.manual_seed(123)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dataset\n",
    "\n",
    "We load the METABRIC data set and split in train, test and validation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = metabric.read_df()\n",
    "df_test = df_train.sample(frac=0.2)\n",
    "df_train = df_train.drop(df_test.index)\n",
    "df_val = df_train.sample(frac=0.2)\n",
    "df_train = df_train.drop(df_val.index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x0</th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "      <th>x3</th>\n",
       "      <th>x4</th>\n",
       "      <th>x5</th>\n",
       "      <th>x6</th>\n",
       "      <th>x7</th>\n",
       "      <th>x8</th>\n",
       "      <th>duration</th>\n",
       "      <th>event</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>5.603834</td>\n",
       "      <td>7.811392</td>\n",
       "      <td>10.797988</td>\n",
       "      <td>5.967607</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>56.840000</td>\n",
       "      <td>99.333336</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>5.284882</td>\n",
       "      <td>9.581043</td>\n",
       "      <td>10.204620</td>\n",
       "      <td>5.664970</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>85.940002</td>\n",
       "      <td>95.733330</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>6.654017</td>\n",
       "      <td>5.341846</td>\n",
       "      <td>8.646379</td>\n",
       "      <td>5.655888</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>66.910004</td>\n",
       "      <td>239.300003</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>5.456747</td>\n",
       "      <td>5.339741</td>\n",
       "      <td>10.555724</td>\n",
       "      <td>6.008429</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>67.849998</td>\n",
       "      <td>56.933334</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>5.425826</td>\n",
       "      <td>6.331182</td>\n",
       "      <td>10.455145</td>\n",
       "      <td>5.749053</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>70.519997</td>\n",
       "      <td>123.533333</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         x0        x1         x2        x3   x4   x5   x6   x7         x8  \\\n",
       "0  5.603834  7.811392  10.797988  5.967607  1.0  1.0  0.0  1.0  56.840000   \n",
       "1  5.284882  9.581043  10.204620  5.664970  1.0  0.0  0.0  1.0  85.940002   \n",
       "3  6.654017  5.341846   8.646379  5.655888  0.0  0.0  0.0  0.0  66.910004   \n",
       "4  5.456747  5.339741  10.555724  6.008429  1.0  0.0  0.0  1.0  67.849998   \n",
       "5  5.425826  6.331182  10.455145  5.749053  1.0  1.0  0.0  1.0  70.519997   \n",
       "\n",
       "     duration  event  \n",
       "0   99.333336      0  \n",
       "1   95.733330      1  \n",
       "3  239.300003      0  \n",
       "4   56.933334      1  \n",
       "5  123.533333      0  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feature transforms\n",
    "We have 9 covariates, in addition to the durations and event indicators.\n",
    "\n",
    "We will standardize the 5 numerical covariates, and leave the binary variables as is. As variables needs to be of type `'float32'`, as this is required by pytorch."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "cols_standardize = ['x0', 'x1', 'x2', 'x3', 'x8']\n",
    "cols_leave = ['x4', 'x5', 'x6', 'x7']\n",
    "\n",
    "standardize = [([col], StandardScaler()) for col in cols_standardize]\n",
    "leave = [(col, None) for col in cols_leave]\n",
    "\n",
    "x_mapper = DataFrameMapper(standardize + leave)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = x_mapper.fit_transform(df_train).astype('float32')\n",
    "x_val = x_mapper.transform(df_val).astype('float32')\n",
    "x_test = x_mapper.transform(df_test).astype('float32')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We need no label transforms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "get_target = lambda df: (df['duration'].values, df['event'].values)\n",
    "y_train = get_target(df_train)\n",
    "y_val = get_target(df_val)\n",
    "durations_test, events_test = get_target(df_test)\n",
    "val = x_val, y_val"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Neural net\n",
    "\n",
    "We create a simple MLP with two hidden layers, ReLU activations, batch norm and dropout. \n",
    "Here, we just use the `torchtuples.practical.MLPVanilla` net to do this.\n",
    "\n",
    "Note that we set `out_features` to 1, and that we have not `output_bias`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "in_features = x_train.shape[1]\n",
    "num_nodes = [32, 32]\n",
    "out_features = 1\n",
    "batch_norm = True\n",
    "dropout = 0.1\n",
    "output_bias = False\n",
    "\n",
    "net = tt.practical.MLPVanilla(in_features, num_nodes, out_features, batch_norm,\n",
    "                              dropout, output_bias=output_bias)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training the model\n",
    "\n",
    "To train the model we need to define an optimizer. You can choose any `torch.optim` optimizer, but here we instead use one from `tt.optim` as it has some added functionality.\n",
    "We use the `Adam` optimizer, but instead of choosing a learning rate, we will use the scheme proposed by [Smith 2017](https://arxiv.org/pdf/1506.01186.pdf) to find a suitable learning rate with `model.lr_finder`. See [this post](https://towardsdatascience.com/finding-good-learning-rate-and-the-one-cycle-policy-7159fe1db5d6) for an explanation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = CoxPH(net, tt.optim.Adam)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "batch_size = 256\n",
    "lrfinder = model.lr_finder(x_train, y_train, batch_size, tolerance=10)\n",
    "_ = lrfinder.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.07390722033525823"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lrfinder.get_best_lr()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Often, this learning rate is a little high, so we instead set it manually to 0.01"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.optimizer.set_lr(0.01)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We include the `EarlyStopping` callback to stop training when the validation loss stops improving. After training, this callback will also load the best performing model in terms of validation loss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "epochs = 512\n",
    "callbacks = [tt.callbacks.EarlyStopping()]\n",
    "verbose = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0:\t[0s / 0s],\t\ttrain_loss: 4.7557,\tval_loss: 3.9349\n",
      "1:\t[0s / 0s],\t\ttrain_loss: 4.6736,\tval_loss: 3.9334\n",
      "2:\t[0s / 0s],\t\ttrain_loss: 4.6137,\tval_loss: 3.9538\n",
      "3:\t[0s / 0s],\t\ttrain_loss: 4.5968,\tval_loss: 3.9501\n",
      "4:\t[0s / 0s],\t\ttrain_loss: 4.5877,\tval_loss: 3.9355\n",
      "5:\t[0s / 0s],\t\ttrain_loss: 4.5896,\tval_loss: 3.9269\n",
      "6:\t[0s / 0s],\t\ttrain_loss: 4.5745,\tval_loss: 3.9359\n",
      "7:\t[0s / 0s],\t\ttrain_loss: 4.5842,\tval_loss: 3.9391\n",
      "8:\t[0s / 0s],\t\ttrain_loss: 4.5660,\tval_loss: 3.9321\n",
      "9:\t[0s / 0s],\t\ttrain_loss: 4.5719,\tval_loss: 3.9433\n",
      "10:\t[0s / 0s],\t\ttrain_loss: 4.5620,\tval_loss: 3.9377\n",
      "11:\t[0s / 0s],\t\ttrain_loss: 4.5691,\tval_loss: 3.9434\n",
      "12:\t[0s / 0s],\t\ttrain_loss: 4.5390,\tval_loss: 3.9436\n",
      "13:\t[0s / 0s],\t\ttrain_loss: 4.5526,\tval_loss: 3.9444\n",
      "14:\t[0s / 0s],\t\ttrain_loss: 4.5575,\tval_loss: 3.9511\n",
      "15:\t[0s / 0s],\t\ttrain_loss: 4.5269,\tval_loss: 3.9482\n",
      "CPU times: user 728 ms, sys: 109 ms, total: 837 ms\n",
      "Wall time: 651 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "log = model.fit(x_train, y_train, batch_size, epochs, callbacks, verbose,\n",
    "                val_data=val, val_batch_size=batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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uXOPYTVHbswGepcrzyhn2eWnsGlvI1954DU+2NeS6pJERFJiTHa59HXunFKeuOZ0vv1oBV/+9V+54+K5XHTSRP2zWpFUevZWqFo3sq9ZOg/Ou3vAxT/60Y+YOnUq1157LQA//elPMTNWrVrF/v376ejo4M477+Tiiy8e1mYjkQjf/e53qaioIBgMcs899/A3f/M3bNiwgauvvpr29nZisRhPPvkkkyZN4rLLLqOyspLOzk7+4R/+ga997WtH9LaTNeZb6F0+eVwhT333DKaOy+L6J97lW49WsPvAwVSXJSLH0NKlS1m+fHn39O9//3uuvvpqnn76ad555x1eeeUVfvjDHw777Liu89DXrVvHE088wZVXXkkkEmHZsmXccMMNrFmzhoqKCsrKynjuueeYNGkSa9euZf369d13WDwWfNFC71JelM1T1y7ikdd28svnt3DOPf+PWxbP4vLTpxJIU2td5JgapCV9tCxYsICamhr27NlDbW0thYWFTJw4kRtvvJFVq1aRlpbG7t27qa6uprS0NOnX/ctf/sL3v/99wLuz4tSpU9m6dSuf/vSnueuuu6isrOQrX/kK06dPZ968edx000386Ec/4sILL+Szn/3s0Xq7h/BNC71LIM341mem8cKNZ3JK+Th+snIDly57ja3VumWAyMfBJZdcwooVK1i+fDlLly7l8ccfp7a2ltWrV7NmzRpKSkr6vQ/6YAZq0X/9619n5cqVZGZmcu655/Lyyy8zY8YMVq9ezbx587jtttu44447RuJtJcV3gd5lyrgsHr36VH71tZP5YF8LF9z3n9zz4lbaooP/s1gRGduWLl3K7373O1asWMEll1xCQ0MDEyZMIBQK8corr/Dhhx8O+zXPPPNMHn/8cQC2bt3KRx99xMyZM3n//fc5/vjjuf7661myZAnvvfcee/bsISsri8svv5ybbrqJd955Z6Tf4oB81eXSl5nx5QVlnDm9mDv/7ybue2kbz6zbyz99dR6nTB2X6vJE5CiYM2cOTU1NTJ48mYkTJ/KNb3yDiy66iIULFzJ//nxmzZo17Ne89tpr+c53vsO8efMIBoM88sgjZGRksHz5ch577DFCoRClpaXcfvvtvP3229x8882kpaURCoV44IEHjsK77N+ovR/60fDqlhp+/PR69jQc5IrTp3LzuTPJDYeOaQ0ifqb7oY8s39wP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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = log.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can get the partial log-likelihood"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-4.979708194732666"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.partial_log_likelihood(*val).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Prediction\n",
    "\n",
    "For evaluation we first need to obtain survival estimates for the test set.\n",
    "This can be done with `model.predict_surv` which returns an array of survival estimates, or with `model.predict_surv_df` which returns the survival estimates as a dataframe.\n",
    "\n",
    "However, as `CoxPH` is semi-parametric, we first need to get the non-parametric baseline hazard estimates with `compute_baseline_hazards`. \n",
    "\n",
    "Note that for large datasets the `sample` argument can be used to estimate the baseline hazard on a subset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "_ = model.compute_baseline_hazards()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "surv = model.predict_surv_df(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "surv.iloc[:, :5].plot()\n",
    "plt.ylabel('S(t | x)')\n",
    "_ = plt.xlabel('Time')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluation\n",
    "\n",
    "We can use the `EvalSurv` class for evaluation the concordance, brier score and binomial log-likelihood. Setting `censor_surv='km'` means that we estimate the censoring distribution by Kaplan-Meier on the test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "ev = EvalSurv(surv, durations_test, events_test, censor_surv='km')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6542846245126293"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ev.concordance_td()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "time_grid = np.linspace(durations_test.min(), durations_test.max(), 100)\n",
    "_ = ev.brier_score(time_grid).plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.16736877357426813"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ev.integrated_brier_score(time_grid)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4951448893250452"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ev.integrated_nbll(time_grid)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
